#ifndef __CACHE_H__
#define __CACHE_H__

#include "common.h"

// 定义缓存块大小为64字节
#define CACHE_BLOCK_BIT 6
// 定义一级缓存的方式位数为3位
#define CACHE_L1_WAY_BIT 3
// 定义一级缓存的组位数为7位
#define CACHE_L1_SET_BIT 7
// 定义二级缓存的方式位数为4位
#define CACHE_L2_WAY_BIT 4
// 定义二级缓存的组位数为12位
#define CACHE_L2_SET_BIT 12
// 定义二级缓存的容量为4MB
#define CACHE_L2_CAP (4 * 1024 * 1024)
// 定义一级缓存的容量为64KB
#define CACHE_L1_CAP (64 * 1024)

// 计算缓存块的大小
#define CACHE_BLOCK_SIZE (1 << CACHE_BLOCK_BIT)
// 计算一级缓存的方式数
#define CACHE_L1_WAY_NUM (1 << CACHE_L1_WAY_BIT)
// 计算一级缓存的组数
#define CACHE_L1_SET_NUM (1 << CACHE_L1_SET_BIT)

// 计算二级缓存的方式数
#define CACHE_L2_WAY_NUM (1 << CACHE_L2_WAY_BIT)
// 计算二级缓存的组数
#define CACHE_L2_SET_NUM (1 << CACHE_L2_SET_BIT)

// 定义一级缓存结构体
typedef struct{
    uint8_t data[CACHE_BLOCK_SIZE];
    uint32_t tag;
    bool validVal;
} L1;

// 定义一级缓存数组
L1 cache_L1[CACHE_L1_SET_NUM * CACHE_L1_WAY_NUM];

// 初始化缓存
void init_cache();

// 从一级缓存中读取数据
int read_cache_L1(hwaddr_t);

// 向一级缓存中写入数据
void write_cache_L1(hwaddr_t, size_t, uint32_t);

// 定义二级缓存结构体
typedef struct{
    uint8_t data[CACHE_BLOCK_SIZE];
    uint32_t tag;
    bool validVal;
    bool dirtyVal;
} L2;

// 定义二级缓存数组
L2 cache_L2[CACHE_L2_SET_NUM * CACHE_L2_WAY_NUM];

// 初始化缓存
void init_cache();

// 从一级缓存中读取数据
int read_cache_L1(hwaddr_t);
// 从二级缓存中读取数据
int read_cache_L2(hwaddr_t);

// 向一级缓存中写入数据
void write_cache_L1(hwaddr_t, size_t, uint32_t);
// 向二级缓存中写入数据
void write_cache_L2(hwaddr_t, size_t, uint32_t);
#endif
